# -*- coding: utf-8 -*-
"""
    @project: pythonProject
    @Author：HanYonghua
    @file： show_fir_response.py
    @date：2025/4/22 19:30
    @blogs: https://www.ncatest.com.cn
"""
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# 设计FIR低通滤波器（截止频率0.2π，阶数31）
# taps = signal.firwin(numtaps=31, cutoff=0.2, window='hamming')

len_h=701
bands = np.array([0., 0.1, .11, .5])
taps = signal.remez(len_h, bands, [1,0], [100,1])

# 设计IIR滤波器（Butterworth低通，阶数4，截止频率0.2π）
b_iir, a_iir = signal.butter(N=4, Wn=0.2, btype='low')


# 计算FIR频率响应
w_fir, h_fir = signal.freqz(taps, [1])  # FIR的a=1

# 计算IIR频率响应
w_iir, h_iir = signal.freqz(b_iir, a_iir)

plt.figure(figsize=(12, 8))

# FIR滤波器的响应
plt.subplot(2, 2, 1)
plt.plot(w_fir / np.pi, 20 * np.log10(np.abs(h_fir)), 'b')
plt.title('FIR滤波器幅频响应')
plt.xlabel('归一化频率 (×π rad/sample)')
plt.ylabel('幅度 (dB)')
plt.grid()

plt.subplot(2, 2, 2)
plt.plot(w_fir / np.pi, np.unwrap(np.angle(h_fir)), 'r')
plt.title('FIR滤波器相频响应')
plt.xlabel('归一化频率 (×π rad/sample)')
plt.ylabel('相位 (rad)')
plt.grid()

# IIR滤波器的响应
plt.subplot(2, 2, 3)
plt.plot(w_iir / np.pi, 20 * np.log10(np.abs(h_iir)), 'b')
plt.title('IIR滤波器幅频响应')
plt.xlabel('归一化频率 (×π rad/sample)')
plt.ylabel('幅度 (dB)')
plt.grid()

plt.subplot(2, 2, 4)
plt.plot(w_iir / np.pi, np.unwrap(np.angle(h_iir)), 'r')
plt.title('IIR滤波器相频响应')
plt.xlabel('归一化频率 (×π rad/sample)')
plt.ylabel('相位 (rad)')
plt.grid()

plt.tight_layout()
plt.show()